package com.bwie.codec;

import com.bwie.protocol.CustomProtocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;

/**
 * 自定义解码器，解析带0x7e首尾标识的数据包
 */
@Slf4j
public class CustomDecoder extends ByteToMessageDecoder {
    // 数据包首尾标识
    private static final byte DELIMITER = (byte) 0x7e;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {

        int length = in.readableBytes();
        // 打印数据
//        for (int i = 0; i < length; i++) {
//            // 读取指定位置的字节（不会移动读指针）
//            byte b = in.getByte(i);
//            String hex = String.format("%02X", b & 0xFF);
//            System.out.println("位置 " + i + ": 0x" + hex);
//        }

        // 读取消息内容
        byte[] content = new byte[length];
        in.readBytes(content, 0, length);

        // 构造消息对象并添加到输出列表
        out.add(new CustomProtocol(revert(content)));

        // 循环处理所有可用数据
//        while (in.readableBytes() > 0) {
//            // 标记当前读位置
//            in.markReaderIndex();
//
//            // 查找首标识
//            if (in.readByte() != DELIMITER) {
//                // 未找到首标识，回退一个字节继续查找
//                in.resetReaderIndex();
//                in.readByte();
//                continue;
//            }
//
//            // 查找尾标识
//            int startIndex = in.readerIndex();
//            boolean found = false;
//
//            while (in.readableBytes() > 0) {
//                if (in.readByte() == DELIMITER) {
//                    // 找到尾标识，计算消息长度
//                    int endIndex = in.readerIndex() - 1;
//                    int length = endIndex - startIndex;
//
//                    // 读取消息内容
//                    byte[] content = new byte[length];
//                    in.resetReaderIndex();
//                    in.readBytes(content, 0, length);
//
//                    // 跳过尾标识
//                    in.readByte();
//
//                    // 构造消息对象并添加到输出列表
//                    out.add(new CustomProtocol(content));
//                    found = true;
//                    break;
//                }
//            }
//
//            if (!found) {
//                // 未找到尾标识，重置读指针等待更多数据
//                in.resetReaderIndex();
//                break;
//            }
//        }
    }
    
    /**
     * 还原转义字节的函数，是CustomEncoder类replace函数的逆操作
     * 如果是0x7D 0x02还原为0x7E，如果是0x7D 0x01还原为0x7D
     * @param data 转义后的字节数组
     * @return 还原后的字节数组
     */
    public byte[] revert(byte[] data) {
        // 创建一个临时的字节数组存储还原后的数据
        byte[] temp = new byte[data.length];
        int index = 0;
        
        for (int i = 0; i < data.length; i++) {
            if (data[i] == (byte) 0x7D && (i + 1) < data.length) {
                // 检查下一个字节是否为0x01或0x02
                if (data[i + 1] == (byte) 0x01) {
                    // 0x7D 0x01还原为0x7D
                    temp[index++] = (byte) 0x7D;
                    i++; // 跳过下一个字节
                } else if (data[i + 1] == (byte) 0x02) {
                    // 0x7D 0x02还原为0x7E
                    temp[index++] = (byte) 0x7E;
                    i++; // 跳过下一个字节
                } else {
                    // 不是转义序列，直接复制
                    temp[index++] = data[i];
                }
            } else {
                // 直接复制
                temp[index++] = data[i];
            }
        }
        
        // 返回实际长度的数据
        return Arrays.copyOf(temp, index);
    }
}